package vip.aning.gitsync.utils;

import org.quartz.CronExpression;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class CronUtil {
    // 定义格式化器
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    public static String dt2cron(String datetime) {
        LocalDateTime dateTime;
        if (datetime != null) {
            dateTime = LocalDateTime.parse(datetime, FORMATTER);
        } else {
            dateTime = LocalDateTime.now();
        }
        return convertToCron(dateTime);
    }


    public static String convertToCron(LocalDateTime dateTime) {
        int second = dateTime.getSecond();
        int minute = dateTime.getMinute();
        int hour = dateTime.getHour();
        int dayOfMonth = dateTime.getDayOfMonth();
        int month = dateTime.getMonthValue();
        // 将周日转换为 0
        int dayOfWeek = dateTime.getDayOfWeek().getValue() % 7;

        // 构造 Cron 表达式
        return String.format("%d %d %d %d %d %d", second, minute, hour, dayOfMonth, month, dayOfWeek);
    }

    /**
     * 解析 Cron 表达式并计算最近的 5 次执行时间
     *
     * @param cronExpression Cron 表达式
     * @return 最近 5 次执行时间的列表
     * @throws ParseException 如果 Cron 表达式无效
     */
    public static List<String> getNextExecutionTimes(String cronExpression) throws ParseException {
        // 创建 CronExpression 对象
        CronExpression cron = new CronExpression(cronExpression);

        // 获取当前时间
        Date currentTime = new Date();

        // 计算最近的 5 次执行时间
        List<String> nextTimes = new ArrayList<>();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        for (int i = 0; i < 5; i++) {
            // 获取下一个有效时间
            currentTime = cron.getNextValidTimeAfter(currentTime);
            if (currentTime != null) {
                nextTimes.add(dateFormat.format(currentTime));
            } else {
                break; // 如果没有更多的执行时间，退出循环
            }
        }

        return nextTimes;
    }

    public static void main(String[] args) throws ParseException {
        // 转换为 Cron 表达式
        String cronExpression = dt2cron("2025-04-19 15:30:45");

        // 输出结果
        System.out.println("Cron 表达式: " + cronExpression);

        // 示例 Cron 表达式 // 每天 10:15:00 执行
        String cronExpression2 = "0 15 10 * * ?"; // 每月
        //String cronExpression2 = "0 15 10 ? * 3"; // 每周
        // 解析 Cron 表达式
        List<String> times = getNextExecutionTimes(cronExpression2);
        // 输出结果
        System.out.println("解析结果：");
        for (String time : times) {
            System.out.println(time);
        }
    }
}
